home *** CD-ROM | disk | FTP | other *** search
/ 3D Games - Real-time Rend…ng & Software Technology / 3D Games - Real-time Rendering & Software Technology.iso / flysdk / plugin / weapon / mine.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-04-10  |  3.6 KB  |  206 lines

  1. #include "..\..\lib\Fly3D.h"
  2. #include "weapon.h"
  3.  
  4. int mine::step(int dt)
  5. {
  6.     if (delay>0)
  7.         {
  8.         delay-=dt;
  9.         return 0;
  10.         }
  11.  
  12.     life-=dt;
  13.  
  14.     if(lookrange&&mine_find)
  15.         {
  16.         enemy=0;
  17.         enemydist=lookrange;
  18.         flyengine->apply_bsp(flyengine->bsp,pos,lookrange,this,mine_find);
  19.         if (enemy)
  20.             life=-1;
  21.         }
  22.  
  23.     if (life<0 || shield<0)
  24.         {
  25.         life=-1;
  26.         if (exp)
  27.             exp->do_explode(pos,Z,player);
  28.         return 0;
  29.         }
  30.  
  31.     if ((life%1000)>500)
  32.         factor=(1000-(life%1000))/500.0f;
  33.     else factor=(life%1000)/500.0f;
  34.  
  35.     if (l)
  36.         {
  37.         l->pos=pos;
  38.         l->illum_radius=lookrange*factor;
  39.         l->step(dt);
  40.         }
  41.     
  42.     if (snd)
  43.         snd->step(dt);
  44.     
  45.     return 0;
  46. }
  47.  
  48. void mine::draw()
  49. {
  50.     if (flyengine->cam==this) 
  51.         return;
  52.  
  53.     if (objmesh)
  54.     {
  55.     static float d;
  56.     if ((flyengine->cur_time%1000)>500)
  57.         d=(250-(flyengine->cur_time%500))/500.0f;
  58.     else d=((flyengine->cur_time%500)-250)/500.0f;
  59.     d=(objmesh->bbox.max.z-objmesh->bbox.min.z)*d;
  60.     if (node)
  61.         {
  62.         objmesh->color=node->color+dynlight;
  63.         dynlight.null();
  64.         }
  65.     glPushMatrix();
  66.     glTranslatef(pos.x,pos.y,pos.z);
  67.     glMultMatrixf((float *)&mat);
  68.     objmesh->draw();
  69.     glPopMatrix();
  70.     }
  71.  
  72.     if (s)
  73.         {
  74.         s->curradius=lookrange*factor;
  75.         s->pos=pos;
  76.         s->draw();
  77.         }
  78.  
  79.     if (l)
  80.         {
  81.         l->pos=pos;
  82.         l->draw();
  83.         }
  84. }
  85.  
  86. bsp_object *mine::clone()
  87. {
  88.     mine *tmp=new mine;
  89.     *tmp=*this;
  90.     tmp->source=this;
  91.     return tmp;
  92. }
  93.  
  94. int mine::get_custom_param_desc(int i,param_desc *pd)
  95. {
  96.     if (pd!=0)
  97.     switch(i)
  98.     {
  99.         case 0:
  100.             pd->type='f';
  101.             pd->data=&lookrange;
  102.             strcpy(pd->name,"lookrange");
  103.             break;
  104.         case 1:
  105.             pd->type=TYPE_EXPLODE;
  106.             pd->data=&exp;
  107.             strcpy(pd->name,"explode");
  108.             break;
  109.         case 2:
  110.             pd->type=TYPE_LIGHT;
  111.             pd->data=&l;
  112.             strcpy(pd->name,"light");
  113.             break;
  114.         case 3:
  115.             pd->type=TYPE_SOUND;
  116.             pd->data=&snd;
  117.             strcpy(pd->name,"sound");
  118.             break;
  119.         case 4:
  120.             pd->type='3';
  121.             pd->data=&objmesh;
  122.             strcpy(pd->name,"mesh");
  123.             break;
  124.         case 5:
  125.             pd->type=TYPE_EXP_SPHERE;
  126.             pd->data=&s;
  127.             strcpy(pd->name,"expsphere");
  128.             break;
  129.         case 6:
  130.             pd->type='i';
  131.             pd->data=&delay;
  132.             strcpy(pd->name,"delay");
  133.             break;
  134.         case 7:
  135.             pd->type='f';
  136.             pd->data=&shield;
  137.             strcpy(pd->name,"shield");
  138.             break;
  139.     }
  140.     return 8;
  141. }
  142.  
  143. void mine::fire(vector& p,vector& dir,float v,int playerid)
  144. {
  145.     mine *m=(mine *)clone();
  146.     m->pos=p;
  147.     m->vel=dir*v;
  148.     m->align_z(dir);
  149.     m->player=playerid;
  150.     if (m->snd)
  151.         {
  152.         m->snd=(dyn_sound *)m->snd->clone();
  153.         m->snd->lockpos=&m->pos;
  154.         m->snd->lockvel=&m->vel;
  155.         m->snd->step(0);
  156.         }
  157.     flyengine->activate(m);
  158. }
  159.  
  160. mesh *mine::ray_intersect(vector& ro,vector& rd,vector& ip,float& dist,int &facenum,float rad)
  161. {
  162.     if (objmesh==0)
  163.         return 0;
  164.     
  165.     facenum=objmesh->ray_intersect(ro-pos,rd,ip,dist,rad);
  166.     
  167.     if (facenum!=-1)
  168.         {
  169.         if (flyengine->stepobj && 
  170.             (flyengine->stepobj->type==TYPE_LASER || flyengine->stepobj->type==TYPE_MISSILE) 
  171.             && dist<1.0f && ((gun_projectile *)flyengine->stepobj)->damage>0.0f)
  172.             shield-=((gun_projectile *)flyengine->stepobj)->damage;
  173.         ip=ip+pos;
  174.         return objmesh;
  175.         }
  176.     else 
  177.         return 0;
  178. }
  179.  
  180. int mine::message(vector& p,float rad,int msg,int param,void *data)
  181. {
  182.     if (msg==FLYOBJM_DAMAGE)
  183.     {
  184.         vector v=pos-p;
  185.         float len=v.length();
  186.         if (len>rad)
  187.             return 0;
  188.  
  189.         flyengine->excludecollision=this;
  190.         if(flyengine->collision_test(flyengine->bsp, p, pos))
  191.             return 0;
  192.         flyengine->excludecollision=0;
  193.         
  194.         shield-=*((float *)data)*(1-len/rad);
  195.     }
  196.     else
  197.     if (msg==FLYOBJM_ILLUM)
  198.     {
  199.         float fac=(p-pos).length()/rad;
  200.         if (fac<1.0f)
  201.             dynlight+=*((vector *)data)*(1.0f-fac);
  202.     }
  203.  
  204.     return 0;
  205. }
  206.